2022最新JUC+多线程面试题

您所在的位置:网站首页 java juc面试 2022最新JUC+多线程面试题

2022最新JUC+多线程面试题

2024-01-27 04:16| 来源: 网络整理| 查看: 265

用法不同:synchronized 可以用来修饰普通方法、静态方法和代码块,而 ReentrantLock 只能用于代码块。

获取锁和释放锁的机制不同:synchronized 是自动加锁和释放锁的,而 ReentrantLock 需要手动加锁和释放锁。

锁类型不同:synchronized 是非公平锁,而 ReentrantLock 默认为非公平锁,也可以手动指定为公平锁。

响应中断不同:ReentrantLock 可以响应中断,解决死锁的问题,而 synchronized 不能响应中断。

import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class ReentrantLockInterrupt { static Lock lockA = new ReentrantLock(); static Lock lockB = new ReentrantLock(); public static void main(String[] args) throws InterruptedException { // 线程 1:先获取 lockA 再获取 lockB Thread t1 = new Thread(() -> { try { // 先获取 LockA lockA.lockInterruptibly(); // 休眠 10 毫秒 TimeUnit.MILLISECONDS.sleep(100); // 获取 LockB lockB.lockInterruptibly(); } catch (InterruptedException e) { System.out.println("响应中断指令"); } finally { // 释放锁 lockA.unlock(); lockB.unlock(); System.out.println("线程 1 执行完成。"); } }); // 线程 2:先获取 lockB 再获取 lockA Thread t2 = new Thread(() -> { try { // 先获取 LockB lockB.lockInterruptibly(); // 休眠 10 毫秒 TimeUnit.MILLISECONDS.sleep(100); // 获取 LockA lockA.lockInterruptibly(); } catch (InterruptedException e) { System.out.println("响应中断指令"); } finally { // 释放锁 lockB.unlock(); lockA.unlock(); System.out.println("线程 2 执行完成。"); } }); t1.start(); t2.start(); TimeUnit.SECONDS.sleep(1); // 线程1:执行中断 t1.interrupt(); } } 复制代码

底层实现不同:sync



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3